package com.qkjia.springselltest.jline;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.shell.jline.FileInputProvider;
import org.springframework.shell.jline.InteractiveShellApplicationRunner;

import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.List;
import java.util.stream.Collectors;

import static org.springframework.shell.jline.ScriptShellApplicationRunner.SPRING_SHELL_SCRIPT_ENABLED;

//*
// * 自定义命令行选项行为
// * Spring Shell自带两个默认的Spring Boot applicationrunner:
// *
// * interveshelapplicationrunner引导Shell REPL。 它设置JLine基础设施，并最终调用Shell.run()
// *
// * ScriptShellApplicationRunner查找程序参数从@开始,
// 假设这些都是本地文件名称和试图运行命令中包含这些文件(使用相同的语义脚本命令),
// * 然后退出过程(通过有效的禁用InteractiveShellApplicationRunner,见下文)。
// *
// * 如果这种行为不适合您，只需提供一个(或多个)ApplicationRunner类型的bean，并可选地禁用标准bean。 你可以从ScriptShellApplicationRunner中获得灵感:
/*
@Order(InteractiveShellApplicationRunner.PRECEDENCE - 100) // Runs before InteractiveShellApplicationRunner
public class ScriptShellApplicationRunner implements ApplicationRunner {

        @Override
        public void run(ApplicationArguments args) throws Exception {
                List<File> scriptsToRun = args.getNonOptionArgs().stream()
                        .filter(s -> s.startsWith("@"))
                        .map(s -> new File(s.substring(1)))
                        .collect(Collectors.toList());

                boolean batchEnabled = environment.getProperty(SPRING_SHELL_SCRIPT_ENABLED, boolean.class, true);

                if (!scriptsToRun.isEmpty() && batchEnabled) {
                        InteractiveShellApplicationRunner.disable(environment);
                        for (File file : scriptsToRun) {
                                try (Reader reader = new FileReader(file);
                                     FileInputProvider inputProvider = new FileInputProvider(reader, parser)) {
                                        shell.run(inputProvider);
                                }
                        }
                }
        }
}*/
